package b_wait_notify;

/**
 * 包子铺类，用于演示生产者和消费者问题。
 * 通过一个共享资源（包子）的计数，以及一个标志位flag来协调生产者和消费者线程的行为。
 */
public class Baozipu {
    private int count = 0; // 包子的计数
    private boolean flag; // 标志位，true表示有包子，false表示没有包子

    /**
     * 获取包子的方法，如果当前没有包子，则等待。
     * 该方法是同步的，以防多个线程同时访问共享资源。
     */
    public synchronized void getCount() {
        while (true){
            // 判断是否有包子，若没有则等待
            if (this.flag == false)
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            if (this.flag == true) {
                break;
            }
        }

        // 开始消费包子
        System.out.println("消费的count = " + count);
        // 消费后更新标志位
        this.flag = false;
        // 唤醒其他所有等待线程（生产者）
        this.notifyAll();
    }

    /**
     * 生产包子的方法，如果当前已有包子，则等待。
     * 该方法是同步的，以保证线程安全。
     */
    public synchronized void setCount() {
        // 判断是否已有包子，若有则等待
        while(true){
            if (this.isFlag() == true)
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            if (this.isFlag() == false) {
                break;
            }

        }


        // 生产包子
        count++;
        System.out.println("生产出来的count = " + count);
        // 生产后更新标志位
        this.flag = true;
        // 唤醒其他所有等待线程（消费者）
        this.notifyAll();
    }

    /**
     * 获取标志位的当前状态。
     * @return 标志位的布尔值，true表示有包子，false表示没有包子。
     */
    public boolean isFlag() {
        return flag;
    }

    /**
     * 设置标志位的状态。
     * @param flag 想要设置的标志位状态，true表示有包子，false表示没有包子。
     */
    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}

